#include <iostream>
using namespace std;
class MyLambda
{
public:
    int n;
    int operator()(int a, int b) const
    {
        return (a + b) * n;
    }
};

// 使用模板定义: 可调用对象（Callable object）。
template <typename F>
// 常见的可调用对象有：
// 1、函数；
// 2、函数指针；
// 3、可转换到函数指针的对象；
// 4、重载了 operator() 的对象（即“函数对象”）；Lambda 表达式
int run_fn(F fn)
{
    return fn(1, 2);
}
int global_num {3};
int main()
{
    // 1、lambda函数闭包：全局变量
    std::cout << run_fn([](int a,int b)-> int{return (a+b)*global_num;}) << std::endl;
    // 2、lambda函数无法直接捕获环境中的变量
    int n{3};
    // std::cout << run_fn([](int a,int b)-> int{return (a+b)*n;}) << std::endl;

    // 3、自定义类实现捕获
    MyLambda x{n};
    std::cout << run_fn(x) << std::endl;

    // 4、lambda捕获局部变量: 带捕获的 Lambda 表达式
    auto fn = [n](int a,int b)-> int{return (a+b)*n;};
    std::cout << run_fn(fn) << std::endl;
    return 0;
}
